iT邦幫忙

2025 iThome 鐵人賽

DAY 4
0
Modern Web

後端攻略筆記系列 第 4

Day 4 : Go語言 slice 與 map - 延伸練習HW

  • 分享至 

  • xImage
  •  

雜貨店小劇場 2.0 —— 進貨、退貨與庫存閾值
👨🍳 劇情:
今天雜貨舖特別忙,不僅有老顧客來買東西,補貨員也想問問「哪些貨快賣完了」。你想用程式幫忙自動檢查哪些商品需要補貨,這樣就不會等到賣光才發現沒庫存啦!

重點功能
• 進貨:顧客買東西就加庫存(AddItem)
• 退貨:顧客退貨就扣庫存(RemoveItem)
• 庫存低於某個數量,自動提示「該補貨了!」(CheckAndAlert)

package main

import (
    "fmt"
)

func Units() map[string]int {
    return map[string]int{
        "quarter_of_a_dozen": 3,
        "half_of_a_dozen":    6,
        "dozen":              12,
        "small_gross":        120,
        "gross":              144,
        "great_gross":        1728,
    }
}

func NewBill() map[string]int { return map[string]int{} }

func AddItem(bill, units map[string]int, item, unit string) bool {
    qty, ok := units[unit]
    if !ok { return false }
    bill[item] += qty
    return true
}

func RemoveItem(bill, units map[string]int, item, unit string) bool {
    qty, ok := units[unit]
    if !ok { return false }
    current, exists := bill[item]
    if !exists { return false }
    if current < qty { return false }
    if current == qty {
        delete(bill, item)
    } else {
        bill[item] -= qty
    }
    return true
}

// 檢查某商品是否需要補貨(低於 threshold 回傳 true)
func CheckAndAlert(bill map[string]int, item string, threshold int) bool {
    qty, exists := bill[item]
    return exists && qty < threshold // 若有此商品且數量低於閾值就該補貨了!
}

func main() {
    units := Units()
    bill := NewBill()

    // 進貨劇情
    fmt.Println("=== 顧客 A 買了 2 打蘋果 ===")
    AddItem(bill, units, "apple", "dozen")
    AddItem(bill, units, "apple", "dozen")
    fmt.Println("蘋果庫存:", bill["apple"]) // 24

    // 退貨劇情
    fmt.Println("\n=== 顧客 B 退 1 打蘋果 ===")
    RemoveItem(bill, units, "apple", "dozen")
    fmt.Println("蘋果剩餘:", bill["apple"]) // 12

    // 檢查是否需要補貨(低於 15 通知)
    if CheckAndAlert(bill, "apple", 15) {
        fmt.Println("警告:蘋果剩", bill["apple"], "個,快補貨!")
    } else {
        fmt.Println("蘋果庫存足夠,不需補貨。")
    }

    // 換香蕉再試一次
    fmt.Println("\n=== 顧客 C 買 1 半打香蕉 ===")
    AddItem(bill, units, "banana", "half_of_a_dozen")
    fmt.Println("香蕉庫存:", bill["banana"]) // 6

    if CheckAndAlert(bill, "banana", 10) {
        fmt.Println("警告:香蕉剩", bill["banana"], "根,快補貨!")
    }
}

上一篇
Day 3 : Go語言 slice 與 map 應用練習
下一篇
Day 5 : Go語言 slice 與 map - 延伸練習HW 2
系列文
後端攻略筆記13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言